автоматическое добавление Boundary в BoundaryGroup

Привет

Я, как было заявлено Евгением, хороший специалист по System Center Operations Manager. Поэтому я пишу про Orchestrator, а теперь еще хочу коротко затронуть SCCM.

Хочу поделиться маленькой идеей автоматизации в SCCM. Суть вопроса в следующем. В средних и крупных компаниях количество физических расположений (сетевых сегментов) большое и динамически меняющееся. То есть имеется большое количество AD sites, которые появляются иногда часто, иногда нет. Все вы знаете, что при помощи Active Directory Forest Discovery могут автоматически создаваться Boundary. Но автоматически они добавляться в Boundary Group не могут. На вопрос почему, сегодня утром Евгений дал мне ответ: «Неизвестен критерий» (он немного иначе сказал, лаконичнее что ли 🙂 ).

Итак, давайте представим часто встречающуюся ситуацию. Есть регионы (страны), в них есть центральный сайт и дочерние сайты. Часто серверное оборудование есть  только в центре региона,  а на дочерних объектах максимум RODC. Distribution Point находится в центральном сайте региона. Вы создаете Boundary Group с именем ИМЯ_РЕГИОНА-CENTER. К нему привязывайте региональную DP. И все Boundary этого региона добавляете в эту Boudary Group. В итоге имеем рутинную задачу, которая так и просится быть автоматизированной.

Одно примечание. Очень желательное, я бы даже сказал, обязательное правило — это стандарт именования.
Пример
Регион — UA. Boundary Group — UA-CENTER. Boundary: UA-Kiev,UA-Lviv и т.д.
Регион — RU. Boundary Group — RU-CENTER. Boundary: RU-Moscow,RU-Razan и т.д.

Реализовать это на Orchestrator не получится, нет у него таких activity :-). Можно запускать ps скрипт, но мы можем запускать его на любом сервере, нужна только SCCM Console и powershell.

Сам скрипт


# подключаемся к SCCM через ps
Import-Module -Name "$(split-path $Env:SMS_ADMIN_UI_PATH)\ConfigurationManager.psd1"
$site = Get-PSDrive -PSProvider CMSite
Set-Location "$($site.name):" #тут может намудрил чуток, но как есть



# получаем все boundry, которые не включены в группы 
$boundries_orphan = Get-CMBoundary | ?{$_.GroupCount -eq 0} 

foreach($b in $boundries_orphan)
{

	$BoundaryName = $b.DisplayName # Тут у нас имя пример 'contoso.com/UA-Kiev'

	if($b.DisplayName -match "(^.+/)(.+)(-.+)") # какой же ps без непонятного кода, читайте про -match

	{
		$BoundaryGroupName = "$($matches[2])-CENTER"
		Add-CMBoundaryToGroup -BoundaryGroupName $BoundaryGroupName -BoundaryName $BoundaryName
	}		

}

Если нет стандарта именования, скрипт просто будет содержать больше проверок.

Создавайте пользователя, делегируйте ему права на модификацию Boundary Group. Не знаете как? Спросите доброго хозяина блога! И через Scheduled Tasks запускайте с необходимой вам частотой.

P.S. Это было не руководство к действию, а просто идея! Если у вас есть хорошие идеи, но пугает реализация, пишите — возможно, мы поможем друг другу.

Александр Петлевой

Leave a Reply